package com.mastercard.assets.web.struts.actions;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import com.mastercard.assets.jpa.TblCuentaPaquete;
import com.mastercard.assets.jpa.TblPaquete;
import com.mastercard.assets.util.MCUtil;
import com.mastercard.assets.web.struts.forms.GenerarCampanaForm;
import com.mastercard.assets.web.struts.forms.GenerarCampanaRegistrarForm;
import com.mastercard.assets.web.util.to.ManejadorPaquetesAsignados;
import com.mastercard.assets.web.util.to.PaqueteAutorizado;
import com.mastercard.assets.web.util.to.UserLogin;

public class GenerarCampanaPreparacion
	extends
		Action
{
	public ActionForward execute(
							ActionMapping mapping , 
							ActionForm form ,
							HttpServletRequest request , 
							HttpServletResponse response )
		throws 
			IOException , 
			ServletException
	{
		HttpSession session = request.getSession( ) ;
		
		// en caos de null
		if( session == null )
			return mapping.findForward( "noLogin" ) ;
		
		// toma el userLogin
		UserLogin user = ( UserLogin ) session.getAttribute( "UserLogin" ) ;
		
		// en caso de null
		if( user == null )
			return mapping.findForward( "noLogin" ) ;
		
		GenerarCampanaForm f = ( GenerarCampanaForm ) form ;
		
		// en caso de que venga en null o cveCuenta en 0
		if( f == null || f.getCveCuenta( ) < 1 )
		{
			user.setNextWorkArea( "/WEB-INF/pages/WorkArea/GenerarCampanaOrigenNoAceptado.do" ) ;
			
			return mapping.findForward( "success" ) ;
		}
		
		// toma el packageManager
		ManejadorPaquetesAsignados packageManager = f.getPackageManager( ) ;
		
		// toma los paqeutesAutorizados
		List< PaqueteAutorizado > paquetesAutorizados = packageManager.getPaqueteAutorizadoLista( ) ;
		
		for( PaqueteAutorizado pa : paquetesAutorizados )
			System.out.println( "GenerarCampanaPreparacion: PaqueteAutorizado cveCuenta/" + pa.getCveCuenta( ) + " tipoHabitacion/" + pa.getTipoHabitacion( ) + " cveAsset/" + pa.getEvento( ).getCveAsset( ) + " CantidadAsignada/" + pa.getCantidadAsignada( ) + " CantidadDisponible/" + pa.getCantidadDisponible( ) + " CantidadOcupada/" + pa.getCantidadOcupada( ) ) ;
		
		// Lista de paquetes
		List< TblCuentaPaquete > paquetesParaCampana = new ArrayList< TblCuentaPaquete >( ) ;
		
		// toma las cantidades dedicadas a la campana
		System.out.println( "GenerarCampanaPreparacion: TraeAsignarInt" ) ;
		int[ ] paquetesAsignadosACampana = f.getAsignarInt( ) ;
                
                // Cantidad de paquetes
                int paqTotal = 0 ;
                for ( int a = 0 ; a < paquetesAsignadosACampana.length ; a++ ){
                    paqTotal += paquetesAsignadosACampana[ a ] ;
                }
		
		System.out.println( "GenerarCampanaPreparacion: paquetesAsignadosACampana/" + paquetesAsignadosACampana.length ) ;
		
		for( int i : paquetesAsignadosACampana )
			System.out.println( "GenerarCampanaPreparacion: paquetesAsignadosACampana[index]/" + i ) ;
		
		// indice para paquetesAsignadosACampana
		int index = 0 ;
		
		// toma el orden de los PaquetesAutorizados
		String[ ] paqueteAutorizadoOrder = f.getPaqueteAutorizadoIdOrder( ) ;
		
		System.out.println( "GenerarCampanaPreparacion: paqueteAutorizadoOrder/" + paqueteAutorizadoOrder.length ) ;
		
		// recorre los valores del orden
		for( String order : paqueteAutorizadoOrder )
		{
			System.out.println( "GenerarCampanaPreparacion: index/" + index + ": valor/" + paquetesAsignadosACampana[ index ] ) ;
			// Lista de paquetes por Asset
                        List< TblCuentaPaquete > paquetesParaCampanaXAsset = new ArrayList< TblCuentaPaquete >( ) ;
			// en caso de que sea menor a 1
			if( paquetesAsignadosACampana[ index ] < 1 )
			{
				index++ ;
				// sigue al siguientes
				continue ;
			}
			
			PaqueteAutorizado paqAut = null ;
			
			System.out.println( "GenerarCampanaPreparacion: order/" + order ) ;
			
			// en caso de null o vacio
			if( order == null || order.trim( ).length( ) == 0 )
			{
				index++ ;
				// continua al siguiente
				continue ;
			}
			
			// toma el orden y lo separa en tokens
			String[ ] tokens = order.split( "-" ) ;
			
			int cveAsset = 0 ;
			int habitacion = 0 ;
			
			try
			{
				cveAsset = Integer.parseInt( tokens[ 0 ] ) ;
				habitacion = Integer.parseInt( tokens[ 1 ] ) ;
			}catch( Exception e )
			{
				index++ ;
				continue ;
			}
			
			System.out.println( "GenerarCampanaPreparacion: cveAsset/" + cveAsset + ": habitacion/" + habitacion + ": size/" + paquetesAutorizados.size( ) ) ;
			
			// recorre la lista de paquetesAutorizados para encontrar el adecuado
			for( PaqueteAutorizado paq : paquetesAutorizados )
			{
				// en caso d que coincida evento y habitacion
				if( paq.getEvento( ).getCveAsset( ) == cveAsset && paq.getTipoHabitacion( ) == habitacion )
				{
					paqAut = paq ;
					
					// quiebra el ciclo
					break ;
				}
			}
			
			System.out.println( "GenerarCampanaPreparacion: paqAut/" + paqAut ) ;
			
			// en caso de que no haya paqAut
			if( paqAut == null )
			{
				System.out.println( 1 ) ;
				
				// es error y por tanto manda a otra pagina.
				user.setMessageError( MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.generarcampana.ErrorSelectingPackagesNoPackageAutorized" , ( ( habitacion == 1 ) ? "Sencilla" : "Doble" ) , cveAsset ) ) ;
				
				return mapping.findForward( "success" ) ;
			}
			
			System.out.println( "GenerarCampanaPreparacion: paqAut/" + paqAut.getCantidadAsignada( ) ) ;
			
			// en caso de que si haya paqAut
			// toma los paquetes
			List< TblCuentaPaquete > paquetesDeAsset = paqAut.getPaquetesAsignadosACuenta( ),
                                pda = new ArrayList< TblCuentaPaquete >( ) ;
                        
                        for( TblCuentaPaquete l : paquetesDeAsset ){//Recorre paquetes INI
                            if( !pda.isEmpty( ) ){
                                
                                TblCuentaPaquete n = null ;
                                int count = 0 ;
                                for( TblCuentaPaquete l2 : pda ){//recorre lista pda INI
                                    if( l.getTblPaquete( ).getFondeado( ) > l2.getTblPaquete( ).getFondeado( ) ){                                        
                                        n = l ;
                                        break ;
                                    }
                                    count ++ ;
                                }//recorre lista pda FIN
                                if( n == null ){// si habitacion de l no es mayor a la de pda, agrega l a pda
                                    pda.add( l ) ;
                                }else{//
                                    TblCuentaPaquete movido = pda.get( count ) ;// toma el objeto del indice que encontro
                                    pda.set(count, n ) ;// coloca el de la lista l en el indice count
                                    pda.add( movido ) ;// pasa el movido hasta el final
                                    
                                }
                                
                                
                            }else{
                                
                                pda.add( l ) ;
                                
                            }
                        }//Recorre paquetes FIN
                        
			// los ordena por tipo de facturacion y fondeado
			//TblCuentaPaquete[ ] paquetesDeAssetArr = paquetesDeAsset.toArray( new TblCuentaPaquete[ 0 ] ) ;
                        TblCuentaPaquete[ ] paquetesDeAssetArr = pda.toArray( new TblCuentaPaquete[ 0 ] ) ;
//			Arrays.sort( paquetesDeAssetArr , new Comparator< TblCuentaPaquete >( )
//					{
//						public int compare( TblCuentaPaquete p1 , TblCuentaPaquete p2 )
//						{
//							// toma el paquete
//							TblPaquete paq1 = p1.getTblPaquete( ) ;
//							TblPaquete paq2 = p2.getTblPaquete( ) ;
//							
//							// toma los datos fondeado y facturado
//							int fon1 = paq1.getFondeado( ) ;
//							int fon2 = paq2.getFondeado( ) ;
//							int fac1 = paq1.getFacturadoA( ) ;
//							int fac2 = paq2.getFacturadoA( ) ;
//							
//							// regresa la diferencia de la suma
//							return ( fon1 + fac1 ) - ( fon2 + fac2 ) ;
//						}
//					} ) ;
			
			System.out.println( "GenerarCampanaPreparacion: paquetesDeAssetArr/" + paquetesDeAssetArr.length ) ;
			
			// toma los primeros paqutes correspondientes
			int finalIndex = ( ( paquetesAsignadosACampana[ index ] > paquetesDeAssetArr.length ) ? paquetesDeAssetArr.length : paquetesAsignadosACampana[ index ] ) ;
			System.out.println( "GenerarCampanaPreparacion: finalindex/" + finalIndex  ) ;
			
			// recorre hasta finalIndex
			for( int i = 0 ; i < paquetesDeAssetArr.length ; i++ )
			{
				System.out.println( "GenerarCampanaPreparacion: paquetesDeAssetArr: cveAsset/" + paquetesDeAssetArr[ i ].getTblPaquete( ).getTblAsset( ).getCveAsset( ) + " cvePaquete/" + paquetesDeAssetArr[ i ].getTblPaquete( ).getCvePaquete( ) + " cveCuentaPauqete/" + paquetesDeAssetArr[ i ].getCveCtaPaquete( ) + " bandera/" + paquetesDeAssetArr[ i ].getBandera( ) ) ;
				
				if( paquetesDeAssetArr[ i ].getStatus( ) == 0 )
					continue ;
				
				if( paquetesDeAssetArr[ i ].getBandera( ) == 1 )
				{
					System.out.println( "GenerarCampanaPreparacion: Agrega" ) ;
					// agrega el TblCuentaPaquete al res
					paquetesParaCampanaXAsset.add( paquetesDeAssetArr[ i ] ) ; //paquetesParaCampana.add( paquetesDeAssetArr[ i ] ) ;
				}
				
				// en caso de que ya sean los que deben ser
				if ( paquetesParaCampanaXAsset.size( ) == finalIndex ) //if( paquetesParaCampana.size( ) == finalIndex )
					break ;
			}
                        
                        for ( int j = 0 ; j < finalIndex ; j++ ){
                                                      
                            paquetesParaCampana.add(paquetesParaCampanaXAsset.get(j));                                                       
                            
                        }
                        

			// aumenta el indice
			index++ ;
		}
		
		// agrega los TblCuentaPaquete al form
		GenerarCampanaRegistrarForm f1 = new GenerarCampanaRegistrarForm( ) ;
		f1.setPaquetesParaCampana( paquetesParaCampana ) ;
		f1.setCveCuenta( f.getCveCuenta( ) ) ;
		
		// guarda en el UserLogin
		user.setManejadorCampana( f1 ) ;
		
//		user.setNextWorkArea( "/WEB-INF/pages/WorkArea/GenerarCampanaDesplegarFormulario.jsp" ) ;
		user.setNextWorkArea( "/GenerarCampanaIn.do" ) ;
		
		return mapping.findForward( "success" ) ;
	}
	
}
